Jenkins 流水线构建镜像发布

171次阅读
没有评论

共计 3366 个字符,预计需要花费 9 分钟才能阅读完成。

背景

之前文章 WordPress 性能优化-Redis篇 提到过,如何在 wordpress 中启用 redis 加快站点访问速度。

当时实现方式为在 docker-compose 中配置 build 构建新的镜像。

而下文会从0开始指导如何构建包含redis、memcache php拓展的 wordpress镜像,并使用 jenkins 流水线构建镜像并发布到私有化镜像仓库。

Jenkins 流水线构建镜像发布

实践

Gitlab

编写 docker file 和 jenkinsfile

dockerfile 和 Jenkinsfile 已测试通过。

流水线将会从 自建的 gitlab 仓库拉取项目代码(Jenkinsfile、Dockerfile)。

对比 WordPress 性能优化-Redis篇,优化了Dockerfile。

引入 https://github.com/mlocati/docker-php-extension-installer 脚本可以简化 php 拓展的编译。

# cat Dockerfile
FROM wordpress:latest
USER root

# 安装 php extension. ref: https://github.com/mlocati/docker-php-extension-installer
ADD https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/

RUN chmod +x /usr/local/bin/install-php-extensions && \
    install-php-extensions redis memcached

Jenkinsfile 包含 3个 串行的stage 和 1个 post:

  • stage(‘Checkout’):检出代码
  • stage(‘Build Docker Image’):构建镜像
  • stage(‘Push Docker Image’):推送镜像
  • post:构建完毕后,执行清理
# cat Jenkinsfile
pipeline {
    agent any

    // 添加选项配置区块
    options {
        disableConcurrentBuilds()
        // 保持构建历史数量
        buildDiscarder(logRotator(numToKeepStr: '100'))
    }

    environment {
        DOCKER_REGISTRY = "***.cn"
        DOCKER_IMAGE = "${DOCKER_REGISTRY}/my-wordpress/wordpress"
        BUILD_TIMESTAMP = sh(script: 'date "+%Y%m%d_%H%M%S"', returnStdout: true).trim()
        GIT_COMMIT_SHORT = sh(script: 'git rev-parse --short HEAD', returnStdout: true).trim()
        IMAGE_TAG = "${BUILD_TIMESTAMP}-${GIT_COMMIT_SHORT}-b${BUILD_NUMBER}"
    }

    stages {
        // 添加阶段描述
        stage('Checkout') {
            steps {
                checkout scm
            }
        }

        //构建镜像
        stage('Build Docker Image') {
            steps {
                script {
                    def dockerBuildCmd = """
                        docker build \
                            --no-cache \
                            --pull \
                            -t ${DOCKER_IMAGE}:${IMAGE_TAG} \
                            -t ${DOCKER_IMAGE}:latest \
                            .
                    """
                    sh dockerBuildCmd
                }
            }
        }
        //推送镜像
        stage('Push Docker Image') {
            steps {
                script {
                    withCredentials([usernamePassword(
                        credentialsId: 'my-wordpress-harbor-token',
                        passwordVariable: 'HARBOR_PASSWORD',
                        usernameVariable: 'HARBOR_USERNAME'
                    )]) {
                        // 使用更安全的凭证处理方式
                        sh '''#!/bin/bash -e
                            echo "$HARBOR_PASSWORD" | docker login "$DOCKER_REGISTRY" -u "$HARBOR_USERNAME" --password-stdin
                            docker push "${DOCKER_IMAGE}:${IMAGE_TAG}"
                            docker push "${DOCKER_IMAGE}:latest"
                        '''
                    }
                }
            }
        }
    }

    post {
        always {
            // 添加清理说明
            echo "Cleaning up docker images..."
            sh '''#!/bin/bash
                docker rmi "${DOCKER_IMAGE}:${IMAGE_TAG}" || true
                docker rmi "${DOCKER_IMAGE}:latest" || true
            '''
            // 清理工作空间
            cleanWs()
        }
        failure {
            echo "Pipeline failed! Please check the logs for details."
        }
        success {
            echo "Pipeline completed successfully!"
        }
    }
}

创建项目

# 创建本地项目目录
mkdir /data/git/my-wordpress && cd /data/git/my-wordpress

# 编辑项目文件
# ls -la
total 16
drwxr-xr-x 2 root root 4096 Nov 14 11:23 .
drwxr-xr-x 5 root root 4096 Nov 14 11:21 ..
-rw-r--r-- 1 root root  348 Nov 14 11:23 Dockerfile
-rw-r--r-- 1 root root 2635 Nov 14 19:37 Jenkinsfile
-rw-r--r-- 1 root root  162 Nov 14 11:23 RREADME.md

# 初始化本地项目并推动到远程仓库
git init --initial-branch=main
git add .
git commit -m "Initial commit "

git remote add origin ssh://git@gitlab.opshub.cn:33322/pengyinwei/my-wordpress.git
git push --set-upstream origin main

配置访问凭证

此访问凭证需要存入到 jenkins 中,用于拉取项目。

设置 –> 仓库 –> 部署令牌

Jenkins 流水线构建镜像发布

Harbor

Harbor 的部署可参考站内文章:Harbor 镜像仓库部署

在 Harbor 中创建一个新项目,和一个用户,并在项目中给用户授权。

此用户需要存入到 jenkins 中,用于推送镜像。

镜像仓库创建访问凭证用户:jenkins-my-wordpress

Jenkins 流水线构建镜像发布

镜像仓库创建项目:my-wordpress,并授权给用户jenkins-my-wordpress

Jenkins 流水线构建镜像发布

Jenkins

部署

关于 jenkins 部署,以及如何在docker 部署的 jenkins 调用 docker 客户端,参考站内文章:docker 部署的 jenkins 调用 docker 客户端

录入凭证

系统管理 –> 凭据管理 –> 系统 –> 全局凭据 –> Add Credentials

将 gitlab 和 harbor 凭证录入,录入后 ID 作为 jenkins 的唯一参数ID来调用。

Jenkins 流水线构建镜像发布

创建流水线任务

新建任务 –> 流水线

使用 Pipeline script from SCM 方式而不是 Pipeline script 管理,这样可以将 jenkinsfile 在 gitlab 中统一维护。

  • 配置项目地址
  • 配置 gitlab 凭证
  • 指定分支

Jenkins 流水线构建镜像发布

执行构建

点击 立即构建:

Jenkins 流水线构建镜像发布

构建执行后可以实时查看输出:
Jenkins 流水线构建镜像发布

构建完毕后,Harbor 上查看镜像:
Jenkins 流水线构建镜像发布

总结

本文将个人场景中的 wordpress 部署方式使用 jenkins 流水线实现。

流水线并没有定义的太复杂,仅仅是完成构建和推送镜像。

实际生产中,可以在流水线中引入更多动作,增强可观测性和可靠性:

  • 构建完毕后发送通知
  • 镜像安全扫描
  • 部署流水线
  • 集成测试

本文属于专题:Jenkins

引用链接

正文完
 
pengyinwei
版权声明:本站原创文章,由 pengyinwei 2024-11-15发表,共计3366字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处:https://www.opshub.cn
评论(没有评论)